/*
	棋盘覆盖问题,分治法

	棋盘用二维数组表示:Board[][],Board[0][0]为左上第一个格子,全局
	size = 2^k

	子棋盘的表示:Board[size][size] 
		tr,tc和棋盘边长s表示
	特殊棋盘用Board[dr][dc]

	L型骨牌:
	个数为(4^k - 1)/3个
	用一个title表示,全局变量,初始为0


	tr 棋盘左上角方格的行号
	tc 棋盘左上角方格的列号
	dr 特殊方格所在的行号
	dc 特殊方格所在的列号
*/

#include <stdio.h>
//int SIZE = 20;
int title = 0;
int Board[128][128] = {0};// 128 = 2^7

void chessBoard(int tr,int tc,int dr,int dc,int size)
{
	if (size == 1)
		return;
	title++;

	int s = size/2;//划分棋盘四个棋盘size减半

	//覆盖棋盘左上方的格子
	if (dr < tr+s && dc < tc + s)//判断特殊方格的位置是否在左上方
	{
		chessBoard(tr,tc,dr,dc,s);
	}
	else
	{
		Board[tr + s - 1][tc + s - 1] = title;
		chessBoard[tr, tc, tr + s - 1, tc + s - 1, s];
	}


	//覆盖棋盘右上方的格子
	if (dr < tr+s && dc >= tc + s)//判断特殊方格是否在右上方
	{
		chessBoard(tr, tc +s, dr, dc,s);
	}
	else
	{
		Board[tr + s - 1][tc + s] = title;
		chessBoard();
	}

	//覆盖棋盘左下方的格子
	if (dr >= tr+s && dc < tc+s)
	{
		chessBoard(tr+s, tc, dr, dc, s);
	}
	else
	{
		Board[tr + s - 1][tc + s] = title;
		chessBoard(tr, tc + s, tr + s - 1, tc + s, s);
	}

	//覆盖棋盘右下方的格子
	if (dr >= tr+s && dc >= tc+s)
	{
		chessBoard(tr+s, tc+s, dr, dc, s);
	}
	else
	{

	}
}

